﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace Infrastructure.Centers
{
    public class ServiceCenterOption
    {
        // 私有字段用于存储本地 IP 地址
        private string _localIp;

        // Consul 服务的 URL，用于与 Consul 交互
        public string ConsulUrl { get; set; }

        // Zipkin 服务的 URL，用于与 Zipkin 进行分布式跟踪
        public string ZipkinUrl { get; set; }

        // 服务的名称，通常用于服务注册时的标识
        public string ServiceName { get; set; }

        // 服务中心的 URL，用于获取 Consul 和 Zipkin 的配置
        public string ServiceCenterUrl { get; set; }

        // 访问令牌，用于验证服务中心的请求
        public string AccessToken { get; set; }

        // 获取 Consul 服务地址的默认 API 接口
        public string GetConsulUrl { get; set; } = "api/Center/GetConsulAddress";

        // 获取 Zipkin 服务地址的默认 API 接口
        public string GetZipkinUrl { get; set; } = "api/Center/GetZipkinAddress";

        // 本地 IP 地址，若未设置则通过 `GetLocalIP` 方法自动获取
        public string LocalIP
        {
            get
            {
                // 如果没有设置本地 IP 地址，则调用 `GetLocalIP` 方法自动获取
                return _localIp ?? GetLocalIP();
            }
            set
            {
                // 设置本地 IP 地址
                _localIp = value;
            }
        }

        // 本地端口号，默认值为 5000
        public int LocalPort { get; set; } = 5000;

        // 健康检查的 URL，用于 Consul 健康检查
        public string HealthCheckUrl { get; set; } = "api/HealthCheck/Index";

        // 存储常量服务信息的字典，可能用于服务注册或与服务中心的其他交互
        public Dictionary<string, string> ConstService { get; set; }

        // 私有静态方法，用于获取本地机器的 IP 地址
        private static string GetLocalIP()
        {
            // 获取所有网络接口，并过滤掉无效的接口
            return (from p in (from p in NetworkInterface.GetAllNetworkInterfaces()
                               where p.OperationalStatus == OperationalStatus.Up && p.NetworkInterfaceType != NetworkInterfaceType.Loopback && p.SupportsMulticast
                               select p.GetIPProperties()).SelectMany((IPInterfaceProperties p) => p.UnicastAddresses)
                    where p.Address.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(p.Address)
                    orderby p.Address.ToString()[(p.Address.ToString().LastIndexOf(".") + 1)..] descending
                    select p).FirstOrDefault()?.Address.ToString(); // 返回第一个符合条件的 IP 地址
        }
    }
}
